/*
 * TDS PEC 4
 * Grupo 3H2M

 * Luis Rodríguez-Manzaneque Sánchez
 *
 * El paquete <code>edu.uoc.tds.pec4.aulas</code> contiene todos los módulos 
 * relativos al subsistema Aulas, tanto la parte de la interfaz gráfica de la 
 * aplicación cliente, como el interfaz e implementación del objeto remoto que
 * provee de servicios a la GUI.
 */
package edu.uoc.tds.pec4.aulas;

import edu.uoc.tds.pec4.rmi.GestorAulasInterface;
import edu.uoc.tds.pec4.beans.CiudadDTO;
import edu.uoc.tds.pec4.beans.LocalizacionDTO;
import edu.uoc.tds.pec4.beans.PaisDTO;
import edu.uoc.tds.pec4.beans.ProvinciaDTO;
import edu.uoc.tds.pec4.beans.SolicitudDTO;
import edu.uoc.tds.pec4.beans.UsuarioDTO;
import edu.uoc.tds.pec4.rmi.GestorDiccionarioInterface;
import edu.uoc.tds.pec4.common.components.TDSCheckbox;
import edu.uoc.tds.pec4.common.components.TablaUI;
import edu.uoc.tds.pec4.common.util.Cabecera;
import edu.uoc.tds.pec4.common.util.Constantes;
import edu.uoc.tds.pec4.common.util.TDSLanguageUtils;
import edu.uoc.tds.pec4.common.util.UtilidadesGUI;
import edu.uoc.tds.pec4.common.validation.ValidarGUI;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorAulasException;
import edu.uoc.tds.pec4.server.bbdd.exceptions.GestorDiccionarioException;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;

/**
 * La clase <code>JIFListadoSolicitudes</code> representa la interfaz de usuario 
 * para la consulta de solicitudes.<br />
 *
 * Interficie de usuario para la consulta de solicitudes.
 *
 * @author	Luis Rodríguez-Manzaneque Sánchez
 * @version	29/11/2011
 * @see		edu.uoc.tds.pec4.common.GestorAulasInterface
 */
public class JIFListadoSolicitudes extends javax.swing.JInternalFrame {

    //====================================================== campos
    //... componentes gráficos
    private JScrollPane jScrollPane = null;
    //Contendra la consulta obtenida, en formato grid
    private TablaUI TablaConsulta = null;
    /** clientConnected Indica si el cliente está conectado al servidor */
    private boolean clientConnected = false;
    /** objRemoto Es el objeto empleado como interfaz en la comunicación RMI */
    private GestorDiccionarioInterface objRemotoDic = null;
    private GestorAulasInterface objRemotoAula = null;

    /** usLogeado representa al usuario que está autentificado */
    private UsuarioDTO usLogeado;

    /**
     * Constructor de la clase.<br />
     * Crea el JInternalFrame del listado de solicitudes
     *
     * @param   pObjRemoto El objeto remoto obtenido a través de la conexión RMI e
     *          implementa la interfaz que sirve las funcionalidades de acceso al
     *          servidor.
     * @throws  RemoteException En caso de producirse un problema con la conexión RMI
     */
    public JIFListadoSolicitudes(UsuarioDTO usLogeado) {
        super(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.titulo"), false, true, false);

        this.usLogeado = usLogeado;
        
        conectarCliente();
        initComponents();

        inicializarComponentes();

        //Situamos la ventana en la pantalla
        this.setLocation(1 , 1);  
    }

    /**
     * Inicializa y situa los componentes de la GUI
     */
    private void inicializarComponentes() {
        // Colocamos los checkbox de los tipos de solicitudes
        PanelTipoSolicitud.setLayout(new GridLayout(3, 1));
        for (int i = 0; i < Constantes.SOLICITUD_TIPOS.length; i++) {
            TDSCheckbox cb = new TDSCheckbox();
            cb.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.tipo." + Constantes.SOLICITUD_TIPOS[i]));
            cb.setValor(Constantes.SOLICITUD_TIPOS[i]);
            PanelTipoSolicitud.add(cb);
        }

        // Colocamos los checkbox de los estados
        PanelEstado.setLayout(new GridLayout(2, 2));
        for (int i = 0; i < Constantes.SOLICITUD_ESTADOS.length; i++) {
            TDSCheckbox cb = new TDSCheckbox();
            cb.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.estado." + Constantes.SOLICITUD_ESTADOS[i]));
            cb.setValor(Constantes.SOLICITUD_ESTADOS[i]);
            PanelEstado.add(cb);
        }

        PanelListado.add(getJScrollPane(), null);
    }

    /**
     * Conectar con el servidor RMI de paises
     * Permitela conexion con el servidor RMI
     */
    private void conectarCliente() {
        try {
            objRemotoDic = (GestorDiccionarioInterface) Naming.lookup("GestorDiccionario");
            objRemotoAula = (GestorAulasInterface) Naming.lookup("GestorAulas");
            clientConnected = true;
        } catch (NotBoundException eNbe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.notbound") + "\n" + eNbe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.url") + "\n" + eRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (MalformedURLException eMULRe) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eMULRe.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        } catch (Exception eE) {
            objRemotoDic = null;
            objRemotoAula = null;
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("cliente.error.conn") + "\n" + eE.getMessage(),
                    TDSLanguageUtils.getMessage("cliente.error"), JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el desplegable de paises
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboPais() {
        if (comboPais == null) {
            try {
                List<PaisDTO> paises = objRemotoDic.listaPaises();
                paises.add(0, new PaisDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.pais.todos.opciondefecto")));
                comboPais = new JComboBox(paises.toArray());
                comboPais.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboPaisActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.pais"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboPais;
    }

    /**
     * Este método inicializa el desplegable de provincias
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboProvincia() {
        if (comboProvincia == null) {
            try {
                int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();
                List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
                provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
                comboProvincia = new JComboBox(provincias.toArray());
                comboProvincia.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        comboProvinciaActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboProvincia;
    }

    /**
     * Este método inicializa el desplegable de ciudades
     *
     * @return javax.swing.JComboBox
     */
    private JComboBox getComboCiudad() {
        if (comboCiudad == null) {
            try {
                int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();
                List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
                ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
                comboCiudad = new JComboBox(ciudades.toArray());
                comboCiudad.addActionListener(new ActionListener() {

                    public void actionPerformed(ActionEvent e) {
                        //comboCiudadActionPerformed(e);
                    }
                });
            } catch (GestorDiccionarioException giE) {
                JOptionPane.showMessageDialog(null,
                        giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            } catch (RemoteException eRe) {
                JOptionPane.showMessageDialog(null,
                        eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                        JOptionPane.ERROR_MESSAGE);
            }
        }
        return comboCiudad;
    }

    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * paises.<br />
     * Provoca el refresco de provincias en el desplegable de provincias, mostrando
     * sólo aquellas que corresponden con el país indicado por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboPaisActionPerformed(java.awt.event.ActionEvent evt) {
        try {
            // Recuperamos el pais seleccionado
            int idPais = ((PaisDTO) comboPais.getSelectedItem()).getIdPais();

            List<ProvinciaDTO> provincias = objRemotoDic.listaProvincias(idPais);
            comboProvincia.removeAllItems();
            provincias.add(0, new ProvinciaDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.provincia.todos.opciondefecto")));
            for (ProvinciaDTO inc : provincias) {
                comboProvincia.addItem(inc);
            }

            // Cargamos el combo de ciudades
            comboProvinciaActionPerformed(null);

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null,
                    ex.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.provincia"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Método que maneja el evento sobre el cambio de opción en el desplegable de
     * provincias.<br />
     * Provoca el refresco de ciudades en el desplegable de ciudades, mostrando
     * sólo aquellas que corresponden con la provincia indicada por el desplegable.<br />
     *
     * Invoca al manejador del desplegable de ciudades para también mostrar las
     * ciiudades vinculadas a la primera provincia seleccionada.
     */
    private void comboProvinciaActionPerformed(java.awt.event.ActionEvent evt) {

        if (comboProvincia.getSelectedItem() == null) {
            return;
        }

        try {
            // Recuperamos la provincia seleccionado
            int idProvincia = ((ProvinciaDTO) comboProvincia.getSelectedItem()).getIdProvincia();
            List<CiudadDTO> ciudades = objRemotoDic.listaCiudades(idProvincia);
            comboCiudad.removeAllItems();
            ciudades.add(0, new CiudadDTO(Constantes.NO_SELECT, TDSLanguageUtils.getMessage("combo.ciudad.todos.opciondefecto")));
            for (CiudadDTO inc : ciudades) {
                comboCiudad.addItem(inc);
            }

        } catch (GestorDiccionarioException giE) {
            JOptionPane.showMessageDialog(null,
                    giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.ciudad"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el botón Buscar
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdBuscar() {
        if (cmdBuscar == null) {
            cmdBuscar = new JButton();
            cmdBuscar.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.boton.buscar"));
            cmdBuscar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdBuscarActionPerformed(e);
                }
            });
        }
        return cmdBuscar;
    }

    /**
     * Método que maneja el evento sobre el botón de Buscar.<br />
     * Realiza la operación de búsqueda de solicitudes.
     */
    private void cmdBuscarActionPerformed(ActionEvent e) {

        //Vaciamos la tabla
        TablaConsulta.setFilas(getFilasTabla(new ArrayList<SolicitudDTO>()));
        TablaConsulta.refrescarFilas();

        //Recuperamos los datos para el filtro
        //pais,provincia,ciudad,listTiposSolicitudes,listEstados
        PaisDTO pais = (PaisDTO) comboPais.getSelectedItem();
        ProvinciaDTO provincia = (ProvinciaDTO) comboProvincia.getSelectedItem();
        CiudadDTO ciudad = (CiudadDTO) comboCiudad.getSelectedItem();
        LocalizacionDTO loc = new LocalizacionDTO(ciudad, provincia, pais);

        // Recuperamos qué tipos se ha seleccionado
        List<Integer> tiposSol = new ArrayList<Integer>();
        for (int i = 0; i < PanelTipoSolicitud.getComponentCount(); i++) {
            if (PanelTipoSolicitud.getComponent(i) instanceof TDSCheckbox) {
                TDSCheckbox check = (TDSCheckbox) PanelTipoSolicitud.getComponent(i);
                if (check.isSelected()) {
                    tiposSol.add(check.getValor());
                }
            }
        }

        // Recuperamos qué Estados se ha seleccionado
        List<Integer> estados = new ArrayList<Integer>();
        for (int i = 0; i < PanelEstado.getComponentCount(); i++) {
            if (PanelEstado.getComponent(i) instanceof TDSCheckbox) {
                TDSCheckbox check = (TDSCheckbox) PanelEstado.getComponent(i);
                if (check.isSelected()) {
                    estados.add(check.getValor());
                }
            }
        }

        try {
            // Llamamos al objeto remoto
            List<SolicitudDTO> sol = objRemotoAula.listaSolicitudes(loc, tiposSol, estados);

            if (!sol.isEmpty()) {
                // Recargo las filas en la tabla
                TablaConsulta.setFilas(getFilasTabla(sol));
                TablaConsulta.refrescarFilas();
            } else {
                // Avisamos que no se han encontrado datos
                JOptionPane.showMessageDialog(null,
                        TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.nohaydatos"),
                        TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.titulo"),
                        JOptionPane.INFORMATION_MESSAGE);
            }

        } catch (GestorAulasException giE) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.gestor.desc") + Constantes.SL
                    + giE.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.gestor"),
                    JOptionPane.ERROR_MESSAGE);
        } catch (RemoteException eRe) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.gestor.desc") + Constantes.SL
                    + eRe.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.remoto.desc"),
                    JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Este método inicializa el botón Cerrar
     *
     * @return javax.swing.JButton
     */
    private JButton getCmdCerrar() {
        if (cmdCerrar == null) {
            cmdCerrar = new JButton();
            cmdCerrar.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.boton.cerrar"));
            cmdCerrar.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    cmdCerrarActionPerformed(e);
                }
            });
        }
        return cmdCerrar;
    }

    /**
     * Método que maneja el evento sobre el botón de Cerrar.<br />
     * Realiza la operación de cierre del frame
     */
    private void cmdCerrarActionPerformed(ActionEvent e) {
        setVisible(false);
    }

    /**
     * Este método inicializa jScrollPane
     *
     * @return javax.swing.JScrollPane
     */
    private JScrollPane getJScrollPane() {
        if (jScrollPane == null) {
            jScrollPane = new JScrollPane();
            jScrollPane.setBounds(new Rectangle(10, 20, 670, 230));
            jScrollPane.setViewportView(getTablaConsulta());
        }
        return jScrollPane;
    }

    /**
     * This method initializes TablaConsulta
     *
     * @return javax.swing.JTable
     */
    private JTable getTablaConsulta() {
        if (TablaConsulta == null) {
            TablaConsulta = new TablaUI(getCabecerasTabla(), getFilasTabla(new ArrayList<SolicitudDTO>()));
            TablaConsulta.setLocation(new Point(0, 0));
            TablaConsulta.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

            TablaConsulta.addMouseListener(new MouseAdapter() {

                public void mouseClicked(MouseEvent e) {
                    if (e.getClickCount() == 2) {
                        int fila = TablaConsulta.rowAtPoint(e.getPoint());
                        //int columna = TablaConsulta.columnAtPoint(e.getPoint());
                        //if ((fila > -1) && (columna > -1))
                        if (fila > -1) {
                            if (ValidarGUI.isInteger(TablaConsulta.getModel().getValueAt(fila, 0).toString())) {
                                int idSolicitud = Integer.parseInt(TablaConsulta.getModel().getValueAt(fila, 0).toString());
                                editarSolicitud(idSolicitud);
                            }
                        }
                    }
                }
            });

          
            TablaConsulta.getTableHeader().addMouseListener(new MouseAdapter() {

                public void mouseClicked(MouseEvent mouseEvent) {
                    int index = TablaConsulta.convertColumnIndexToModel(TablaConsulta.columnAtPoint(mouseEvent.getPoint()));
                    if (index >= 0) {
                        System.out.println("Click en columna " + index + " " + TablaConsulta.getModel().getColumnName(index));
                    }
                }
            ;
        }
        );            
        }
        return TablaConsulta;
    }

    /**
     * Genera las cabeceras de las columnas tabla. El mapa de cabeceras es una
     * estructura de tipo diccionario que implementa pares clave-valor, siendo la
     * clave la posición de la columna y el valor la columna, en concreto un objeto
     * de tipo Cabecera que a su vez lleva el nombre de la columna y su ancho
     *
     * @return  Un objeto <code>Map<Cabecera, Integer></code> que mantiene un
     *          diccionario con todas las columnas de la tabla, su posición y
     *          tamaño.
     */
    private List<Cabecera> getCabecerasTabla() {
        // La Cabecera indica el nombre de columna y tamaño
        List<Cabecera> vCabecera = new ArrayList<Cabecera>();

        // Recordar: Cabecera (titulo, anchoColumna)

        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.solicitud"), 50));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.tipo"), 140));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.fecha"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.hora"), 60));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.estado"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.cliente"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.ciudad"), 90));
        vCabecera.add(new Cabecera(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.provincia"), 90));

        return vCabecera;
    }

    /**
     * A partir de una lista de objetos, devuelve listas de listas de objetos para
     * que se puedan mostrar en una tabla
     *
     * @return javax.swing.JTable
     */
    private List<List> getFilasTabla(List<SolicitudDTO> vCv) {
        List<List> solicitudes = new ArrayList<List>();

        try {
            List<Integer> vId = new ArrayList<Integer>();
            List<String> vTipo = new ArrayList<String>();
            List<String> vFSolicitud = new ArrayList<String>();
            List<Date> vHSolicitud = new ArrayList<Date>();
            List<String> vEstado = new ArrayList<String>();
            List<String> vCliente = new ArrayList<String>();
            List<String> vCiudad = new ArrayList<String>();
            List<String> vProvincia = new ArrayList<String>();
            for (SolicitudDTO cv : vCv) {
                vId.add(cv.getIdSolicitud());
                vTipo.add(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.tipo." + cv.getTipo()));
                vFSolicitud.add(UtilidadesGUI.obtenerFecha(cv.getFechaSol()));
                vHSolicitud.add(cv.getHoraSol());
                vEstado.add(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.estado." + cv.getEstado()));
                vCliente.add(cv.getNomCliente());
                vCiudad.add(cv.getNomCiudad());
                vProvincia.add(cv.getNomProvincia());
            }
            solicitudes.add(vId);
            solicitudes.add(vTipo);
            solicitudes.add(vFSolicitud);
            solicitudes.add(vHSolicitud);
            solicitudes.add(vEstado);
            solicitudes.add(vCliente);
            solicitudes.add(vCiudad);
            solicitudes.add(vProvincia);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null,
                    TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.err.filas") + Constantes.SL
                    + e.getMessage(), TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.error"),
                    JOptionPane.ERROR_MESSAGE);
        }

        return solicitudes;
    }

    private void editarSolicitud(int idSolicitud) {
        Frame frame = JOptionPane.getFrameForComponent(this);
        DialogDetalleSolicitud dlDetalleSolicitud = new DialogDetalleSolicitud(frame, true,
                objRemotoDic, objRemotoAula, idSolicitud, usLogeado);

        dlDetalleSolicitud.setVisible(true);

        System.out.println(idSolicitud);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        PanelFiltro = new javax.swing.JPanel();
        PanelLocalizacion = new javax.swing.JPanel();
        labelPais = new javax.swing.JLabel();
        comboPais = getComboPais();
        labelProvincia = new javax.swing.JLabel();
        comboProvincia = getComboProvincia();
        labelCiudad = new javax.swing.JLabel();
        comboCiudad = getComboCiudad();
        PanelTipoSolicitud = new javax.swing.JPanel();
        PanelEstado = new javax.swing.JPanel();
        cmdBuscar = getCmdBuscar();
        PanelListado = new javax.swing.JPanel();
        cmdCerrar = getCmdCerrar();

        PanelFiltro.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.filtro"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelFiltro.setName(""); // NOI18N

        PanelLocalizacion.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.localizacion"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelLocalizacion.setName(""); // NOI18N

        labelPais.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelPais.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.pais"));

        labelProvincia.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelProvincia.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.provincia"));

        labelCiudad.setFont(new java.awt.Font("Tahoma", 1, 11));
        labelCiudad.setText(TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.ciudad"));

        javax.swing.GroupLayout PanelLocalizacionLayout = new javax.swing.GroupLayout(PanelLocalizacion);
        PanelLocalizacion.setLayout(PanelLocalizacionLayout);
        PanelLocalizacionLayout.setHorizontalGroup(
            PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelLocalizacionLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(labelProvincia)
                    .addComponent(labelPais)
                    .addComponent(labelCiudad))
                .addGap(18, 18, 18)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(comboCiudad, 0, 174, Short.MAX_VALUE)
                    .addComponent(comboPais, 0, 174, Short.MAX_VALUE)
                    .addComponent(comboProvincia, 0, 174, Short.MAX_VALUE))
                .addContainerGap())
        );
        PanelLocalizacionLayout.setVerticalGroup(
            PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelLocalizacionLayout.createSequentialGroup()
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelPais)
                    .addComponent(comboPais, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelProvincia)
                    .addComponent(comboProvincia, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(PanelLocalizacionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(labelCiudad)
                    .addComponent(comboCiudad, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        PanelTipoSolicitud.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.tipo"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelTipoSolicitud.setName(""); // NOI18N

        javax.swing.GroupLayout PanelTipoSolicitudLayout = new javax.swing.GroupLayout(PanelTipoSolicitud);
        PanelTipoSolicitud.setLayout(PanelTipoSolicitudLayout);
        PanelTipoSolicitudLayout.setHorizontalGroup(
            PanelTipoSolicitudLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 165, Short.MAX_VALUE)
        );
        PanelTipoSolicitudLayout.setVerticalGroup(
            PanelTipoSolicitudLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 83, Short.MAX_VALUE)
        );

        PanelEstado.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.estado"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelEstado.setName(""); // NOI18N

        javax.swing.GroupLayout PanelEstadoLayout = new javax.swing.GroupLayout(PanelEstado);
        PanelEstado.setLayout(PanelEstadoLayout);
        PanelEstadoLayout.setHorizontalGroup(
            PanelEstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 165, Short.MAX_VALUE)
        );
        PanelEstadoLayout.setVerticalGroup(
            PanelEstadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 56, Short.MAX_VALUE)
        );

        cmdBuscar.setText("Buscar");

        javax.swing.GroupLayout PanelFiltroLayout = new javax.swing.GroupLayout(PanelFiltro);
        PanelFiltro.setLayout(PanelFiltroLayout);
        PanelFiltroLayout.setHorizontalGroup(
            PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelFiltroLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PanelLocalizacion, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(PanelTipoSolicitud, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addGroup(PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(PanelEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(cmdBuscar))
                .addContainerGap())
        );
        PanelFiltroLayout.setVerticalGroup(
            PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(PanelFiltroLayout.createSequentialGroup()
                .addComponent(PanelEstado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 11, Short.MAX_VALUE)
                .addComponent(cmdBuscar))
            .addGroup(PanelFiltroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                .addComponent(PanelTipoSolicitud, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(PanelLocalizacion, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        PanelListado.setBorder(javax.swing.BorderFactory.createTitledBorder(null, TDSLanguageUtils.getMessage("aulas.consulta.solicitudes.panel.listado"), javax.swing.border.TitledBorder.DEFAULT_JUSTIFICATION, javax.swing.border.TitledBorder.DEFAULT_POSITION, new java.awt.Font("Tahoma", 1, 11))); // NOI18N
        PanelListado.setName(""); // NOI18N

        javax.swing.GroupLayout PanelListadoLayout = new javax.swing.GroupLayout(PanelListado);
        PanelListado.setLayout(PanelListadoLayout);
        PanelListadoLayout.setHorizontalGroup(
            PanelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 674, Short.MAX_VALUE)
        );
        PanelListadoLayout.setVerticalGroup(
            PanelListadoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 222, Short.MAX_VALUE)
        );

        cmdCerrar.setText("Cerrar");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(PanelListado, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(PanelFiltro, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(cmdCerrar, javax.swing.GroupLayout.Alignment.TRAILING))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(PanelFiltro, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(PanelListado, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(cmdCerrar)
                .addContainerGap(19, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel PanelEstado;
    private javax.swing.JPanel PanelFiltro;
    private javax.swing.JPanel PanelListado;
    private javax.swing.JPanel PanelLocalizacion;
    private javax.swing.JPanel PanelTipoSolicitud;
    private javax.swing.JButton cmdBuscar;
    private javax.swing.JButton cmdCerrar;
    private javax.swing.JComboBox comboCiudad;
    private javax.swing.JComboBox comboPais;
    private javax.swing.JComboBox comboProvincia;
    private javax.swing.JLabel labelCiudad;
    private javax.swing.JLabel labelPais;
    private javax.swing.JLabel labelProvincia;
    // End of variables declaration//GEN-END:variables
}
